package main.java.maziacs;

import java.util.List;
import java.util.Map;
import java.util.Vector;

import main.java.maziacs.characters.Maziacs;
import main.java.maziacs.characters.Position;
import main.java.maziacs.counters.Bag;
import main.java.maziacs.squares.ISquare;
public interface IBoard {

	/**
	 * Coloca una loseta en el tablero que sea adyacente a otra
	 */
	public abstract void putTile(ITile tile1, ISquare sq1, ITile tile2, ISquare sq2);

	/**
	 * Getter of the property <tt>startTile</tt>
	 * @return  Returns the startTile.
	 * @uml.property  name="startTile"
	 */
	public abstract ITile getStartTile();

	/**
	 * Setter of the property <tt>startTile</tt>
	 * @param startTile  The startTile to set.
	 * @uml.property  name="startTile"
	 */
	public abstract void setStartTile(Tile startTile);

	/**
	 * Getter of the property <tt>endTile</tt>
	 * @return  Returns the endTile.
	 * @uml.property  name="endTile"
	 */
	public abstract ITile getEndTile();

	/**
	 * Setter of the property <tt>endTile</tt>
	 * @param endTile  The endTile to set.
	 * @uml.property  name="endTile"
	 */
	public abstract void setEndTile(ITile endTile);

	/**Extrae una loseta de la lista de losetas disponibles.
	 * Una vez extraida la elimina de la lista de disponibles para que no se pueda 
	 * volver a sacar
	 */
	public abstract ITile takeOutTile();

	/**Comprueba si 1 loseta se puede poner adyacente a otra, la casilla por la que es
	 * adyacente tiene que ser blanca.
	 */
	public abstract boolean legalPositionTile(ITile tile1, ITile tile2,
			Position pos1, Position pos2);

	/** 
	 * Getter of the property <tt>tiles</tt>
	 * @return  Returns the tiles.
	 * @uml.property  name="tiles"
	 */
	public abstract List<Tile> getTiles();

	/** 
	 * Setter of the property <tt>tiles</tt>
	 * @param tiles  The tiles to set.
	 * @uml.property  name="tiles"
	 */
	public abstract void setTiles(List<Tile> tiles);

	public abstract void setLastTile(ITile lastTile);

	public abstract ITile getLastTile();

	public abstract void setTilesOnBoard(Vector<Vector<ITile>> tilesOnBoard);

	public abstract Vector<Vector<ITile>> getTilesOnBoard();
	
	public Integer euclideanDistanceTiles();
	
	public Map<Maziacs, Position> getMaziacs();

	public void setMaziacs(Map<Maziacs, Position> maziacs);
	
	public IGame getGame();
	
	public void setGame(IGame game);
	
	public void setPath(Path path);

	public Path getPath();
	
	public Bag getBag();

	public void setBag(Bag bag);
	
	public void putMaziac(ITile t);
}